package cn.com.jcoo.security.enums;

/**
 * 分组算法，分组模式 这几种模式适用于对称加密算法中，对称加密算法的特点是密文长度等于密文长度；加解密用同一组秘钥。
 * 在CFB、OFB、CTR模式中需要涉及到流密码（序列密码）的概念 序列密码与分组密码的对比 分组密码：分组密码(block
 * cipher)的数学模型是将明文消息编码表示后的数字（简称明文数字）序列，划分成长度为n的组（可看成长度为n的矢量），每组分别在密钥的控制下变换成等长的输出数字（简称密文数字）序列
 * 分组密码以一定大小作为每次处理的基本单元，而序列密码则是以一个元素（一个字母或一个比特）作为基本的处理单元。
 * 序列密码是一个随时间变化的加密变换，具有转换速度快、低错误传播的优点，硬件实现电路更简单；其缺点是：低扩散（意味着混乱不够）、插入及修改的不敏感性。
 * 分组密码使用的是一个不随时间变化的固定变换，具有扩散性好、插入敏感等优点；其缺点是：加解密处理速度慢、存在错误传播。
 * 序列密码涉及到大量的理论知识，提出了众多的设计原理，也得到了广泛的分析，但许多研究成果并没有完全公开，这也许是因为序列密码目前主要应用于军事和外交等机密部门的缘故。目前，公开的序列密码算法主要有RC4、SEAL等。
 * @author Jinty
 * @since 1.0
 */
public enum GroupMode {

	/**
	 * 每一个明文块对应一个密文块，是最简单的对称加密模式 缺点：
	 * ECB模式中，明文分组与密文分组是一一对应的关系，因此，如果明文中存在多个相同的明文分组，则这些明文分组最终都将被转换为相同的密文分组。
	 * 这样一来，只要观察一下密文，就可以知道明文存在怎样的重复组合，并可以以此为线索来破译密码，因此ECB模式是存在一定风险的。
	 * 除了这种模式，其他的模式都需要一个初始的向量
	 */
	ECB("Electronic CodeBook", "电子密码本模式", "/ECB/"),
	/**
	 * 优点： ①每一次加密都需要前一个密文块参与，明文中微小的改变都会使后续所有密文改变；②无法从密文看出明文的规律。安全性得以提高。目前，CBC是最为常用的工作模式。
	 * 缺点： ①由于每次加密都需要前一个密文参与，所以无法并行加密，只能串行加密，加密速度受到限制。
	 * 但是只要有两个相邻的密文块，就可以解密出后一个密文块的明文，比如知道密文2和密文3，就可以解密出明文3。所以解密是可以并行执行的。
	 * ②改变某个密文块，只会影响当前和下一个解密出的明文，不会影响后续解密过程。
	 */
	CBC("Cipher-block chaining", "密码块连接模式", "/CBC/"),

	/**
	 * 当明文长度不能被分组长度整除时，最后一个分组就需要进行填充。CTS模式是使用最后一个分组的前一个密文分组整除时，最后一个分组的前一个密文分组数据来进行填充的，它通常和ECB模式以及CBC模式配合使用。
	 * 根据最后一个分组的发顺序不同，CTS模式有几种不同的变体（CBC-CS1、CBC-CS2、CBC-CS3）
	 */
	CTS("", "", ""),
	/**
	 * 优点：PCBC模式优点与CBC模式基本一致。
	 * ①每一次加密都需要前一个密文块与明文块参与，明文中微小的改变都会使后续所有密文改变，同样密文的改变也使解密出的明文变化很大； ②无法从密文看出明文的规律；
	 * ③明文的任意改动会使后续密文都改变，同样密文的任意改动会使后续解密出的明文全部改变。安全性得以提高。
	 * 缺点：由于每次加密都需要前一个密文参与，所以无法并行加密，只能串行加密，加密速度受到限制。
	 */
	PCBC("Propagating cipher-block chaining", "填充密码块链接模式", "/PCBC/"),

	/**
	 * 优点： ①隐藏了明文模式; ②分组密码转化为流模式; ③可以及时加密传送小于分组的数据; 缺点： ①不利于并行计算; ②误差传送：一个明文单元损坏影响多个单元;
	 * ③唯一的IV;
	 */
	CFB("Cipher feedback", "密文反馈模式", "/CFB/"),

	/**
	 * 优点:1.隐藏了明文模式;2.分组密码转化为流模式;3.可以及时加密传送小于分组的数据;
	 * 缺点:1.不利于并行计算;2.对明文的主动攻击是可能的;3.误差传送：一个明文单元损坏影响多个单元;
	 */
	OFB("Output feedback", "输出反馈模式", "/OFB/"),

	/**
	 * CTR 模式被广泛用于 ATM 网络安全和 IPSec应用中，相对于其它模式而言，CRT模式具有如下特点： ■ 硬件效率：允许同时处理多块明文 / 密文。 ■
	 * 软件效率：允许并行计算，可以很好地利用 CPU 流水等并行技术。 ■
	 * 预处理：算法和加密盒的输出不依靠明文和密文的输入，因此如果有足够的保证安全的存储器，加密算法将仅仅是一系列异或运算，这将极大地提高吞吐量。 ■ 随机访问：第 i
	 * 块密文的解密不依赖于第 i-1 块密文，提供很高的随机访问能力。 ■ 可证明的安全性：能够证明 CTR 至少和其他模式一样安全（CBC, CFB, OFB, ...）
	 * ■ 简单性：与其它模式不同，CTR模式仅要求实现加密算法，但不要求实现解密算法。对于 AES 等加/解密本质上不同的算法来说，这种简化是巨大的。 ■
	 * 无填充，可以高效地作为流式加密使用。
	 */
	CTR("Counter mode", "计数器模式", "/CTR/"),;

	private final String en;
	private final String zh;
	private final String reg;

	GroupMode(String en, String zh, String reg) {
		this.en = en;
		this.zh = zh;
		this.reg = reg;
	}

	public String getEn() {
		return en;
	}

	public String getZh() {
		return zh;
	}

	public String getReg() {
		return reg;
	}
}
